#! /usr/bin/env python
#coding=utf-8
import re
import config
import random

def grid(uniStr):
	'''
	操他妈的敏感词
	滚他妈的关键字
	
	==>
	
	┌─┬─┬─┬─┬─┬─┬─┐
	│操│他│妈│的│敏│感│词│
	├─┴─┴─┴─┴─┴─┴─┤
	├─┬─┬─┬─┬─┬─┬─┤
	│滚│他│妈│的│关│键│字│
	└─┴─┴─┴─┴─┴─┴─┘
	'''
	
	lines = uniStr.splitlines()
	
	col = 0
	row = len(lines) - 1
	
	for line in lines:
		if col < len(line):
			col = len(line)
	
	dest = u'┌' + u'─┬' * (col-1) + u'─┐\n'
	
	count = 0
	for line in lines:
		if col > len(line):
			line += u'　' * (col - len(line))
		line = re.sub(ur'([\x00-\x80])', ur'\1 ', line)
		line = re.sub(ur'([\x00-\x80] |[^\x00-\x80])', ur'│\1', line)
		dest += line+ u'│'+ u'\n'
		if count == row:
			dest += u'└' + u'─┴'*(col-1) + u'─┘'
		else:
			dest += u'├' + u'─┼' * (col-1) + u'─┤\n'
		count += 1
	
	return dest

def composition(uniStr):
	'''
	操他妈的敏感词
	滚他妈的关键字
	
	==>
	
	┌─┬─┬─┬─┬─┬─┬─┐
	│操│他│妈│的│敏│感│词│
	├─┼─┼─┼─┼─┼─┼─┤
	│滚│他│妈│的│关│键│字│
	└─┴─┴─┴─┴─┴─┴─┘
	'''
	lines = uniStr.splitlines()
	
	col = 0
	row = len(lines) - 1
	
	for line in lines:
		if col < len(line):
			col = len(line)
	
	dest = u'┌' + u'─┬' * (col-1) + u'─┐\n'
	
	count = 0
	for line in lines:
		if col > len(line):
			line += u'　' * (col - len(line))
		line = re.sub(ur'([\x00-\x80])', ur'\1 ', line)
		line = re.sub(ur'([\x00-\x80] |[^\x00-\x80])', ur'│\1', line)
		dest += line+ u'│'+ u'\n'
		if count == row:
			dest += u'└' + u'─┴'*(col-1) + u'─┘'
		else:
			dest += u'├' + u'─┴' * (col-1) + u'─┤\n'
			dest += u'├' + u'─┬' * (col-1) + u'─┤\n'
		count += 1
	
	return dest

def space(uniStr):
	'''
	操他妈的敏感词
	滚他妈的关键字
	
	==>
	
	操 他 妈 的 敏 感 词
	滚 他 妈 的 关 键 字	
	'''
	lines = uniStr.splitlines()
	dest = u''
	for line in lines:
		#半角字符补空格
		line = re.sub(ur'([\x00-\x80])', ur'\1 ', line)
		#插入空格
		line = re.sub(ur'([\x00-\x80] |[^\x00-\x80])', ur'\1 ', line)
		dest += line[:-1] + '\n'

	return dest

def underline(uniStr):
	'''
	操他妈的敏感词
	滚他妈的关键字
	
	==>
	
	操_他_妈_的_敏_感_词
	滚_他_妈_的_关_键_字	
	'''
	lines = uniStr.splitlines()
	dest = u''
	for line in lines:
		#半角字符补空格
		line = re.sub(ur'([\x00-\x80])', ur'\1 ', line)
		#插入空格
		line = re.sub(ur'([\x00-\x80] |[^\x00-\x80])', ur'\1_', line)
		dest += line[:-1] + '\n'
	
	return dest

def randomchar(uniStr):
	'''
	操他妈的敏感词
	滚他妈的关键字
	
	==>
	
	$操&他-妈*的]敏!感@词
	^滚:他@妈:的<关$键~字
	'''
	def get_random_char():
		chars = u'''~!@#$%^&*()_+=-`[]\';/.,{}|":?><'''
		return chars[random.randint(0, len(chars)-1)]
		
	lines = uniStr.splitlines()
	dest = u''
	for line in lines:
		#半角字符补空格
		line = re.sub(ur'([\x00-\x80])', ur'\1 ', line)
		#插入随机字符
		line = re.sub(ur'([\x00-\x80] |[^\x00-\x80])', ur'\1\t', line)
		while True:
			if line.find("\t") == -1:
				break
			line = line.replace("\t", get_random_char(), 1)
		dest += line[:-1] + '\n'
	
	return dest
	

trans_func = {
 u'方格':{
'example': 
u'''┌─┬─┬─┬─┬─┬─┬─┐
│操│他│妈│的│敏│感│词│
├─┼─┼─┼─┼─┼─┼─┤
│滚│他│妈│的│关│键│字│
└─┴─┴─┴─┴─┴─┴─┘
''',
'func':grid
},

u'作文本':{ 
'example': 
u'''┌─┬─┬─┬─┬─┬─┬─┐
│操│他│妈│的│敏│感│词│
├─┴─┴─┴─┴─┴─┴─┤
├─┬─┬─┬─┬─┬─┬─┤
│滚│他│妈│的│关│键│字│
└─┴─┴─┴─┴─┴─┴─┘
''',
'func':composition
},

u'空格':{
'example':
u'''操 他 妈 的 敏 感 词
滚 他 妈 的 关 键 字
''',
'func':space
},

u'下划线':{
'example':
u'''操_他_妈_的_敏_感_词
滚_他_妈_的_关_键_字
''',
'func':underline	
},

u'随机':{
'example':
u'''$操&他-妈*的]敏!感@词
^滚:他@妈:的<关$键~字
''',
'func':randomchar
},

}

font_qualifier = {
u'无':{
      'prefix':'',
	  'suffix':'',
     },
'Discuz':{
       'prefix':u'[font=宋体]',
	   'suffix':u'[/font]',
	  },
'ubb':{
       'prefix':u'[face=宋体]',
	   'suffix':u'[/face]',
	  },
'Html':{
        'prefix':u'<font face="宋体">',
	    'suffix':u'</font>',
	   },
}

class transform:
	def __init__(self):
		self.option = config.TransformConfig()
		
	def trans(self, uniStr):
		if len(uniStr) == 0:
			return uniStr

		if uniStr[0] == u'\ufeff':
			uniStr = uniStr[1:]
		
		uniStr += u'\n本文由《操他妈的敏感词》排版编辑'
		
		if self.option['autoTypeset']:
			uniStr = self.typeset(uniStr)
		
		uniStr = trans_func.values()[self.option['mode']]['func'](uniStr)
		
		if self.option['fontQualifier'] != 0:
			fq = font_qualifier.values()[self.option['fontQualifier']]
			uniStr = '%s\n%s\n%s' % (fq['prefix'], uniStr, fq['suffix'])
		
		return uniStr
	
	def typeset(self, uniStr):
		'''
		如果 lineLength = 4:
		
		操他妈的敏感词
		滚他妈的关键字
		
		==>
		
		操他妈的
		敏感词
		
		滚他妈的
		关键字
		'''
		#如果中间有空行分隔，把空行中间的字合并在一起
		if len(re.findall(r'\n{2,}', uniStr)) > 1:
			uniStr = re.sub(r'\n([^\n])', r'\1', uniStr) #去除单个的回车
		
		lines = uniStr.splitlines()
		maxlen = self.option['lineLength']
		newStr = u''
		for line in lines:
			line = line.strip()
			if len(line) == 0:
				continue
			count = 2
			newStr += u'　　'
			for char in line:
				newStr += char
				count += 1
				if count >= maxlen:
					newStr += '\n'
					count = 0
			if newStr[-1] == '\n':
				newStr += '\n'
			else:
				newStr += '\n\n'
		
		newStr = newStr[:-1]
		
		return newStr
